package main

import (
	"fmt"
	"oop"
	"oop/queue"
)

type MyTreeNode struct {
	node *oop.Node
}

// 后序遍历 左->右->根
func (myNode *MyTreeNode) postOrder() {
	if myNode == nil || myNode.node == nil { // 不能包装空的node
		return
	}
	// 将左右节点提出来 直接调用报错
	left := MyTreeNode{myNode.node.Left}
	right := MyTreeNode{myNode.node.Right}
	left.postOrder()
	right.postOrder()
	myNode.node.Print()
}
func main() {
	// funcName()

	// q 在push pop 中本身值就会改变(参照slice) 因为指针接收者可以改变里面的值
	q := queue.Queue{1}
	q.Push(2)
	q.Push("abc")
	q.Push(3)
	fmt.Println(q.Pop())
	fmt.Println(q.Pop())
	fmt.Println(q.IsEmpty())
	q.Pop()
	fmt.Println(q.IsEmpty())

}

func funcName() {
	var root oop.Node
	fmt.Println(root)
	root = oop.Node{Value: 3}
	root.Left = &oop.Node{4, nil, nil}
	root.Right = &oop.Node{5, nil, nil}
	root.Right.Left = new(oop.Node)
	// 新建空Node(root.Right 是指针,不管指针还是实例都用.)
	root.Right.Left.Right = oop.CreateNode(4)
	fmt.Println(root)
	fmt.Println("结构体定义方法")
	root.Print()
	fmt.Println()
	root.SetValue(7)

	// 用地址也可以
	pRoot := &root
	pRoot.Print()
	pRoot.SetValue(100)

	// nil 也很正常
	var pRoot2 *oop.Node
	pRoot2.SetValue(200)
	pRoot2 = &root
	pRoot2.SetValue(300)
	pRoot2.Print()

	// 指针，直接使用地址
	root.Print()
	// 值传递,会拷贝
	fmt.Println()
	fmt.Println(root)
	// 结构体切片
	nodes := []oop.Node{
		{Value: 3},
		{},
		{6, nil, &root},
	}
	fmt.Println(nodes)
	fmt.Println("traverse root: ")
	root.Traverse()
	fmt.Println()
	myRoot := MyTreeNode{&root}
	myRoot.postOrder()
}
